ColdFusion 9でpptxが綺麗にPDF変換されない
以前ColdFusion 9でPPTをPDFに変換してみるで<cfdocument>タグを使ったPDF変換を試してみましたが、今回はもう少し深く検証してみました。検証するのはoffice2007形式のpptxファイル。
最初はシンプルなファイルを変換していたので、特に問題なく変換されてると思っていましたが、Office2007以降の拡張子pptxについては変換自体はできるが中身が欠落していたり、うまく変換できない場合があり、そのうまく変換されないページを抜き出して別ファイルで保存して、原因の調査しました。
抜き出したファイルは以下の様なシンプルなものです。
<cfdocument>タグを使って変換した結果のPDFの状態
結論から言うとPDF変換する際にColdFusionサーバにインストールしたOpenOfficeが原因でした。ColdFusion側の問題ではなかった。サーバにインストールされているOpenOfficeでpptxを直接開いてみると以下の様な状態で開かれます。
という事でこれを回避する方法がないかと思い、pptxのファイルをOpenOfficeのファイル形式に変換してくれるツールがあったので、odf-converter-integrator-0.2.3-installer.exeを試してみました。
odf-converter-integratorツールをインストールしてからpptxを開いた結果は以下の通りです。なかなかいい感じで変換できている様です。
で、無駄な処理と分かりつつpptxをアップロードされた場合は一旦ツールを使ってodpファイルに変換して、変換したodpファイルをpptxに変換するという処理を一度入れて、<cfexecute>タグでpptx→odp→pptxにしてその後に<cfdocument>タグでPDF変換してみました。
実行結果は期待通りに綺麗に変換されました。
これで使えるかなと思って再度100ページほどある元ファイル(pptx)を変換してみましたが、それなりに綺麗に変換できたので、一応許容範囲かなと思います。
検証したサンプルプログラムは以下の通りです。(pptxアップロード用のHTML):ppt-pdf-upload.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html lang=ja> <head> <meta http-equiv="Content-Type" content="text/html;charset=UTF-8"> <meta http-equiv="Content-Script-Type" content="text/javascript"> </head> <body> <form action="ppt-pdf-sample.cfm" name="form1" method="post" enctype="multipart/form-data"> <input type="file" size="100" name="uploadForm"> <input type="submit"> </form> </body> </html>
サーバ側の処理プログラム(pptx→odp→pptx→pdf変換):ppt-pdf-sample.cfm
<html> <head> <meta http-equiv="Content-type" content="text/html; charset=utf-8"> <title>sample/title> </head> <body> <cfif IsDefined("form.uploadForm")> <cffile action="upload" destination="C:\inetpub\wwwroot\simple\galleriffic\upload" nameConflict="Overwrite" filefield="uploadForm"> </cfif> <!--- Office2007以降のファイルの場合、変換する ---> <cfif #cffile.SERVERFILEEXT# is "pptx"> <!--- コマンドライン形式でpptx形式からodp形式に変換 ---> <cfexecute name="C:\Program Files (x86)\odf-converter-integrator\OdfConverter.exe" arguments="/I #SERVERDIRECTORY#\#SERVERFILE#" timeout="240" /> <!--- とりあえずアップロードされたpptxを削除 ---> <cffile action="delete" file="#SERVERDIRECTORY#\#SERVERFILE#"> <!--- コマンドライン形式でodp形式からpptx形式に再度変換 ---> <cfexecute name="C:\Program Files (x86)\odf-converter-integrator\OdfConverter.exe" arguments="/ODP2PPTX /I #SERVERDIRECTORY#\#SERVERFILENAME#.odp" timeout="240" /> <!--- 中間ファイルodp形式ファイルを削除 ---> <cffile action="delete" file="#SERVERDIRECTORY#\#SERVERFILENAME#.odp"> </cfif> <!--- PPTからPDFに変換する ---> <cfdocument format="pdf" srcfile="#cffile.ServerDirectory#\#cffile.SERVERFILE#" filename="#SERVERDIRECTORY#\#SERVERFILENAME#.pdf" overwrite="yes"></cfdocument> <!--- 生成したPDFファイルを表示する ---> <cflocation url="http://127.0.0.1/simple/galleriffic/upload/#URLEncodedFormat(CLIENTFILENAME)#.pdf"> </body> </html>